package com.itheima.leetcode.od.b.sort;

import java.util.Arrays;
import java.util.stream.Collectors;

/**
 * (B卷,100分)- 磁盘容量排序（Java & JS & Python）
 * <p>
 * 题目描述
 * <p>
 * 磁盘的容量单位常用的有M，G，T这三个等级，
 * <p>
 * 它们之间的换算关系为1T = 1024G，1G = 1024M，
 * <p>
 * 现在给定n块磁盘的容量，请对它们按从小到大的顺序进行稳定排序，
 * <p>
 * 例如给定5块盘的容量，1T，20M，3G，10G6T，3M12G9M
 * <p>
 * 排序后的结果为20M，3G，3M12G9M，1T，10G6T。
 * <p>
 * 注意单位可以重复出现，上述3M12G9M表示的容量即为3M+12G+9M，和12M12G相等。
 * <p>
 * 输入描述
 * <p>
 * 输入第一行包含一个整数n(2 <= n <= 100)，表示磁盘的个数，
 * <p>
 * 接下的n行，每行一个字符串(长度大于2，小于30)，
 * <p>
 * 表示磁盘的容量，由一个或多个格式为mv的子串组成，
 * <p>
 * 其中m表示容量大小，v表示容量单位，例如20M，1T，30G，10G6T，3M12G9M。
 * <p>
 * 磁盘容量m的范围为1到1024的正整数，
 * <p>
 * 容量单位v的范围只包含题目中提到的M，G，T三种，换算关系如题目描述。
 * <p>
 * 输出描述
 * <p>
 * 输出n行，表示n块磁盘容量排序后的结果。
 * <p>
 * 用例
 * <p>
 * 输入
 * <p>
 * 3
 * <p>
 * 1G
 * <p>
 * 2G
 * <p>
 * 1024M
 * <p>
 * 输出
 * <p>
 * 1G
 * <p>
 * 1024M
 * <p>
 * 2G
 * <p>
 * 说明	1G和1024M容量相等，稳定排序要求保留它们原来的相对位置，故1G在1024M之前。
 * <p>
 * 输入
 * <p>
 * 3
 * <p>
 * 2G4M
 * <p>
 * 3M2G
 * <p>
 * 1T
 * <p>
 * 输出
 * <p>
 * 3M2G
 * <p>
 * 2G4M
 * <p>
 * 1T
 * <p>
 * 说明	1T的容量大于2G4M，2G4M的容量大于3M2G。
 * <p>
 * 题目解析
 * <p>
 * 简单的字符串操作+排序，具体逻辑请看代码。
 * <p>
 * 2023.06.15
 * <p>
 * 本题Java注意int的整型溢出，建议使用long。
 */
public class SortingOfDiskCapacity {
    public static void main(String[] args) {
        /*Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();

        String[] capacitys = new String[n];
        for (int i = 0; i < n; i++) {
            capacitys[i] = sc.next();
        }*/

        int n = Integer.parseInt("3");
        String[] capacitys = Arrays.stream("1G\n2G\n1024M".split("\n"))
                .toArray(String[]::new);

        System.out.println(getResult(capacitys));
    }

    public static String getResult(String[] capacitys) {
        return Arrays.stream(capacitys)
                .sorted((a, b) -> Long.compare(calc(a), calc(b)))
                .collect(Collectors.joining("\n"));
    }

    public static Long calc(String capacity) {
        long ans = 0;

        StringBuilder num = new StringBuilder();
        for (int i = 0; i < capacity.length(); i++) {
            char c = capacity.charAt(i);

            if (c >= '0' && c <= '9') {
                num.append(c);
            } else {
                switch (c) {
                    case 'M':
                        ans += Long.parseLong(num.toString());
                        break;
                    case 'G':
                        ans += Long.parseLong(num.toString()) * 1024;
                        break;
                    case 'T':
                        ans += Long.parseLong(num.toString()) * 1024 * 1024;
                        break;
                }

                num = new StringBuilder();
            }
        }

        return ans;
    }
}